<?php
/**
 * 节点类型控制器
 */

declare (strict_types = 1);

namespace app\controller\lawcase;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;

class NodeType extends BaseController
{
    /**
     * 获取节点类型列表
     */
    public function list()
    {
        try {
            $param = Request::param();
            
            // 构建查询条件
            $where = [];
            $where[] = ['delete_time', '=', 0];
            
            // 关键词搜索
            if (!empty($param['keywords'])) {
                $where[] = ['name', 'like', '%' . trim($param['keywords']) . '%'];
            }
            
            // 查询节点类型列表
            $list = Db::name('node_type')
                ->where($where)
                ->order('sort', 'asc')
                ->order('id', 'asc')
                ->select()
                ->each(function($item) {
                    $item['create_time'] = date('Y-m-d H:i', $item['create_time']);
                    $item['update_time'] = $item['update_time'] ? date('Y-m-d H:i', $item['update_time']) : '';
                    return $item;
                });
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $list,
                'count' => count($list)
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '获取失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 查看节点类型详情
     */
    public function view()
    {
        $param = Request::param();
        
        if (empty($param['id'])) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }
        
        try {
            $nodeType = Db::name('node_type')
                ->where('id', $param['id'])
                ->where('delete_time', 0)
                ->find();
            
            if (empty($nodeType)) {
                return json(['code' => 404, 'msg' => '节点类型不存在']);
            }
            
            // 格式化时间
            $nodeType['create_time'] = date('Y-m-d H:i', $nodeType['create_time']);
            $nodeType['update_time'] = $nodeType['update_time'] ? date('Y-m-d H:i', $nodeType['update_time']) : '';
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $nodeType
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '获取失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 获取节点类型选择列表（用于下拉选择）
     */
    public function select_list()
    {
        try {
            // 查询启用的节点类型列表
            $list = Db::name('node_type')
                ->where('delete_time', 0)
                ->order('sort', 'asc')
                ->order('id', 'asc')
                ->select();
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $list
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '获取失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 新增节点类型
     */
    public function add()
    {
        $param = Request::param();
        
        // 数据验证
        if (empty($param['name'])) {
            return json(['code' => 400, 'msg' => '节点类型名称不能为空']);
        }
        
        // 检查节点类型名称是否已存在
        $exists = Db::name('node_type')
            ->where('name', $param['name'])
            ->where('delete_time', 0)
            ->find();
        
        if ($exists) {
            return json(['code' => 400, 'msg' => '节点类型名称已存在']);
        }
        
        $data = [
            'name' => $param['name'],
            'description' => $param['description'] ?? '',
            'sort' => $param['sort'] ?? 100,
            'create_time' => time(),
            'update_time' => time()
        ];
        
        try {
            // 新增节点类型
            $nodeTypeId = Db::name('node_type')->insertGetId($data);
            
            return json(['code' => 0, 'msg' => '保存成功', 'data' => ['id' => $nodeTypeId]]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '保存失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 编辑节点类型
     */
    public function edit()
    {
        $param = Request::param();
        
        // 数据验证
        if (empty($param['id'])) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }
        
        if (empty($param['name'])) {
            return json(['code' => 400, 'msg' => '节点类型名称不能为空']);
        }
        
        // 检查节点类型是否存在
        $nodeType = Db::name('node_type')
            ->where('id', $param['id'])
            ->where('delete_time', 0)
            ->find();
        
        if (!$nodeType) {
            return json(['code' => 404, 'msg' => '节点类型不存在']);
        }
        
        // 检查节点类型名称是否已存在（排除当前编辑的记录）
        $exists = Db::name('node_type')
            ->where('name', $param['name'])
            ->where('id', '<>', $param['id'])
            ->where('delete_time', 0)
            ->find();
        
        if ($exists) {
            return json(['code' => 400, 'msg' => '节点类型名称已存在']);
        }
        
        $data = [
            'id' => $param['id'],
            'name' => $param['name'],
            'description' => $param['description'] ?? $nodeType['description'],
            'sort' => $param['sort'] ?? $nodeType['sort'],
            'update_time' => time()
        ];
        
        try {
            // 更新节点类型
            Db::name('node_type')->update($data);
            
            return json(['code' => 0, 'msg' => '更新成功', 'data' => ['id' => $param['id']]]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '更新失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 删除节点类型（软删除）
     */
    public function delete()
    {
        $param = Request::param();
        
        if (empty($param['id'])) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }
        
        try {
            // 检查节点类型是否存在
            $nodeType = Db::name('node_type')
                ->where('id', $param['id'])
                ->where('delete_time', 0)
                ->find();
            
            if (!$nodeType) {
                return json(['code' => 404, 'msg' => '节点类型不存在']);
            }
            
            // 检查是否有案件节点使用该节点类型
            $nodeCount = Db::name('case_node')
                ->where('node_type', $param['id'])
                ->where('delete_time', 0)
                ->count();
            
            if ($nodeCount > 0) {
                return json(['code' => 400, 'msg' => '有案件节点使用该节点类型，不能删除']);
            }
            
            // 软删除节点类型
            Db::name('node_type')
                ->where('id', $param['id'])
                ->update([
                    'delete_time' => time(),
                    'update_time' => time()
                ]);
            
            return json(['code' => 0, 'msg' => '删除成功']);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '删除失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 更新节点类型排序
     */
    public function sort()
    {
        $param = Request::param();
        
        if (empty($param['id'])) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }
        
        try {
            $data = [
                'id' => $param['id'],
                'sort' => $param['sort'] ?? 0,
                'update_time' => time()
            ];
            
            Db::name('node_type')->update($data);
            
            return json(['code' => 0, 'msg' => '排序更新成功']);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '排序更新失败: ' . $e->getMessage()]);
        }
    }
}